﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Entidades;
using LogicaNegocio;

namespace PresentacionEscritorio
{
    public partial class frmRegistrarHorarioMedico : Form, IFormsPadre_Hijo
    {
        private frmRegistrarEspecialidadPorMedico myFormPadre;
        public EspecialidadMedico MiEspecialidadMedico { get; set; }

        //lista que va a ser grabada en la BD, la que va a contener todos los cambios
        //que se van haciendo con los horarios segun la carga y descaga en la grilla
        private List<HorarioAtencion> listHorariosActualizados;

        public frmRegistrarHorarioMedico()
        {
            InitializeComponent();
        }

        private void frmRegistrarHorarioMedico_Load(object sender, EventArgs e)
        {
            listHorariosActualizados = new List<HorarioAtencion>();
            dtpVigenciaHasta.Enabled = false;
            chkHabilitar.Checked = false;
            txtCantidadSobreturnos.Enabled = false;
            cargarComboDiaSemana();
            cargarComboConsultorios();
            cargarComboFrecuencias();
            cargarEspecialidadYMedico();
            if (MiEspecialidadMedico.TieneHorario)
                cargarGrillaHorarios();
        }

        private void cargarEspecialidadYMedico()
        {
            GestorMedicos gm = new GestorMedicos();
            string especialidad = MiEspecialidadMedico.Especialidad.Nombre;
            string nombreMed = gm.obtenerNombreMedico(MiEspecialidadMedico.LegajoMedico);
            lblEspecialidadYMedico.Text = "Médico: " + nombreMed + "\n\rEspecialidad: " + especialidad;
        }

        private void cargarComboFrecuencias()
        {
            GestorFrecuencias gf = new GestorFrecuencias();
            List<FrecuenciaHorarioAtencion> listaF = gf.obtenerTodasFrecuencias();
            cmbFrecuenciaHorario.DataSource = listaF;
            cmbFrecuenciaHorario.ValueMember = "IdHorario";
            cmbFrecuenciaHorario.DisplayMember = "Periodo";
        }

        private void cargarComboConsultorios()
        {
            GestorConsultorios gcons = new GestorConsultorios();
            List<Consultorio> listCons = gcons.obtenerTodosConsultorios();
            cmbConsultorio.DataSource = listCons;
            cmbConsultorio.DisplayMember = "Nombre";
            cmbConsultorio.ValueMember = "IdConsultorio";
        }

        private void cargarComboDiaSemana()
        {
            GestorDiasSemana gds = new GestorDiasSemana();
            List<DiaSemana> listDias = gds.obtenerTodosDiasSemana();
            cmbDiaSemana.DataSource = listDias;
            cmbDiaSemana.DisplayMember = "Nombre";
            cmbDiaSemana.ValueMember = "CodDiaSemana";
        }

        private void cargarGrillaHorarios()
        {
            //limpiamos si la grilla tiene algo
            if (dgvHorariosMedico.RowCount > 0)
                dgvHorariosMedico.Rows.Clear();

            GestorHorariosMedico ghm = new GestorHorariosMedico();
            List<HorarioAtencion> listHorarios = ghm.obtenerHorariosAtencionMedicoEnEspecialidad(MiEspecialidadMedico.CodEspecialidad, MiEspecialidadMedico.LegajoMedico);

            if (listHorarios != null)
            {
                //cargamos la grilla
                int i = -1; //nro de fila
                foreach (HorarioAtencion item in listHorarios)
                {
                    i = dgvHorariosMedico.Rows.Add();
                    dgvHorariosMedico.Rows[i].Cells["CodHorario"].Value = item.CodHorarioAtencion; //columna no visible
                    dgvHorariosMedico.Rows[i].Cells["Dia"].Value = item.Dia.Nombre;
                    dgvHorariosMedico.Rows[i].Cells["HoraDesde"].Value = item.HoraDesde;
                    dgvHorariosMedico.Rows[i].Cells["HoraHasta"].Value = item.HoraHasta;
                    dgvHorariosMedico.Rows[i].Cells["Frecuencia"].Value = item.FrecuenciaHorario.Periodo;
                    dgvHorariosMedico.Rows[i].Cells["VigenteDesde"].Value = item.FechaVigenciaDesde;
                    if (item.FechaVigenciaHasta != null)
                        dgvHorariosMedico.Rows[i].Cells["VigenteHasta"].Value = item.FechaVigenciaHasta;
                    else
                        dgvHorariosMedico.Rows[i].Cells["VigenteHasta"].Value = "No definido";
                    dgvHorariosMedico.Rows[i].Cells["PermiteST"].Value = item.PermiteSobreturno;
                    if (item.CantidadSobreturnos != null)
                        dgvHorariosMedico.Rows[i].Cells["CantidadST"].Value = item.CantidadSobreturnos;
                    else
                        dgvHorariosMedico.Rows[i].Cells["CantidadST"].Value = "No aplica";
                }
            }

            //actualizarCantHorarios();
        }

        private void actualizarCantHorarios()
        {
            GestorMedicos gm = new GestorMedicos();
            if (dgvHorariosMedico.RowCount > 0)
                MiEspecialidadMedico.TieneHorario = true;
            else
                MiEspecialidadMedico.TieneHorario = false;
            gm.actualizarCantHorariosEspecialidadMedico(MiEspecialidadMedico);
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }

        public void setFormPadre(Form formPadre)
        {
            myFormPadre = (frmRegistrarEspecialidadPorMedico)formPadre;
        }

        public void setFormHijo(Form formHijo)
        {
            throw new NotImplementedException();
        }

        private void btnCargarHorario_Click(object sender, EventArgs e)
        {
            if (validarDatos())
            {
                int codDiaSemana = int.Parse(cmbDiaSemana.SelectedValue.ToString());
                string nombreDiaSemana = cmbDiaSemana.SelectedText;

                TimeSpan horaDesde = TimeSpan.Parse(txtHoraDesde.Text);
                TimeSpan horaHasta = TimeSpan.Parse(txtHoraHasta.Text);

                int nroConsultorio = int.Parse(cmbConsultorio.SelectedValue.ToString());
                string nombreConsultorio = cmbConsultorio.SelectedText;

                DateTime fechaDesde = dtpVigenciaDesde.Value;
                DateTime? fechaHasta = null;
                if (chkHabilitar.Checked)
                    fechaHasta = dtpVigenciaHasta.Value;

                int codFrecuencia = int.Parse(cmbFrecuenciaHorario.SelectedValue.ToString());
                string nombreFrecuencia = cmbFrecuenciaHorario.SelectedText;

                int? cantST = null;
                bool permST = false;
                if (txtCantidadSobreturnos.Enabled)
                {
                    cantST = int.Parse(txtCantidadSobreturnos.Text);
                    permST = true;
                }

                HorarioAtencion horarioNuevo = new HorarioAtencion();
                horarioNuevo.CodHorarioAtencion = 0;
                horarioNuevo.CodEspecialidad = MiEspecialidadMedico.CodEspecialidad;
                horarioNuevo.Legajo = MiEspecialidadMedico.LegajoMedico;
                horarioNuevo.IdDiaSemana = codDiaSemana;
                horarioNuevo.IdConsultorio = nroConsultorio;
                horarioNuevo.IdFrecuenciaHorario = codFrecuencia;
                horarioNuevo.HoraDesde = horaDesde;
                horarioNuevo.HoraHasta = horaHasta;
                horarioNuevo.FechaVigenciaDesde = fechaDesde;
                horarioNuevo.FechaVigenciaHasta = fechaHasta;
                horarioNuevo.PermiteSobreturno = permST;
                horarioNuevo.CantidadSobreturnos = cantST;

                //validamos este horario a ver si es posible de agregar
                GestorHorariosMedico ghm = new GestorHorariosMedico();
                string medOcupaHorario;
                bool resValidarHorario = ghm.validarNuevoHorario(horarioNuevo, out medOcupaHorario);

                if (resValidarHorario)
                {
                    //insertamos el horario en la BD
                    ghm.insertarNuevoHorario(horarioNuevo);
                    cargarGrillaHorarios();

                }
                else
                {
                    MessageBox.Show("El horario no está disponible, existe otro horario asignado en ese periodo para ese consultorio: \n\r" +
                        medOcupaHorario, "Aviso", MessageBoxButtons.OK);
                }
                limpiarCampos();
            }
        }

        private void limpiarCampos()
        {
            cmbDiaSemana.SelectedText = "";
            txtHoraDesde.Text = null;
            txtHoraHasta.Text = null;
            cmbFrecuenciaHorario.SelectedText = "";
            cmbConsultorio.SelectedText = "";
            dtpVigenciaDesde.Value = DateTime.Now;
            dtpVigenciaHasta.Enabled = false;
            dtpVigenciaHasta.Value = DateTime.Now;
            chkHabilitar.Checked = false;
            txtCantidadSobreturnos.Text = null;
            txtCantidadSobreturnos.Enabled = false;
            rdbNoSobreturno.Checked = false;
            rdbSiSobreturno.Checked = false;
        }

        //valida los datos del form. Si está ok, res = true. Si falla algo, res = false;
        private bool validarDatos()
        {
            bool res = true;
            string error = "";
            if (cmbDiaSemana.SelectedValue == null)
            {
                error += "No se ha seleccionado un día de la semana \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtHoraDesde.Text))
            {
                error += "La hora de inicio de la atención es requerida \n\r";
                res = false;
            }
            if (string.IsNullOrEmpty(txtHoraHasta.Text))
            {
                error += "La hora de fin de la atención es requerida \n\r";
                res = false;
            }
            if (cmbConsultorio.SelectedValue == null)
            {
                error += "No se ha seleccionado consultorio de atención \n\r";
                res = false;
            }
            if (dtpVigenciaDesde.Value.Date < DateTime.Now.Date)
            {
                error += "La fecha desde debe ser una fecha igual o posterior al día de hoy";
                res = false;
            }
            if (chkHabilitar.Checked == true && dtpVigenciaHasta.Value < dtpVigenciaDesde.Value)
            {
                error += "La fecha hasta debe ser una fehca posterior a la fecha desde \n\r";
                res = false;
            }
            if (cmbFrecuenciaHorario.SelectedValue == null)
            {
                error += "No se ha seleccionado frecuencia de atención";
                res = false;
            }
            if (txtCantidadSobreturnos.Enabled)
            {
                if (string.IsNullOrEmpty(txtCantidadSobreturnos.Text))
                {
                    error += "La cantidad de sobreturnos no ha sido especificada \n\r";
                    res = false;
                }
                else
                {
                    int num;
                    bool resConv = int.TryParse(txtCantidadSobreturnos.Text, out num);
                    if (!resConv)
                    {
                        error += "La cantidad de sobreturnos debe ser un número \n\r";
                        res = false;
                    }
                }
            }

            //mostramos los errores si los hay
            if (!res)
                MessageBox.Show(error, "Aviso", MessageBoxButtons.OK);
            return res;
        }

        private void chkHabilitar_CheckedChanged(object sender, EventArgs e)
        {
            if (chkHabilitar.Checked)
                dtpVigenciaHasta.Enabled = true;
            else
                dtpVigenciaHasta.Enabled = false;
        }

        private void rdbSiSobreturno_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbSiSobreturno.Checked)
                txtCantidadSobreturnos.Enabled = true;
            else
                txtCantidadSobreturnos.Enabled = false;
        }

        private void rdbNoSobreturno_CheckedChanged(object sender, EventArgs e)
        {
            if (rdbNoSobreturno.Checked)
                txtCantidadSobreturnos.Enabled = false;
            else
                txtCantidadSobreturnos.Enabled = true;
        }

        private void dgvHorariosMedico_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (dgvHorariosMedico.CurrentCell.OwningColumn == dgvHorariosMedico.Columns["Eliminar"])
            {
                DialogResult dresult = MessageBox.Show("Seguro que desea eliminar este horario?", "Confirmar", MessageBoxButtons.YesNoCancel);
                if (dresult == DialogResult.Yes)
                {
                    //damos de baja el horario de la BD, asignando fechaHasta = datetime.now
                    GestorHorariosMedico ghm = new GestorHorariosMedico();
                    int codHorario = int.Parse(dgvHorariosMedico.CurrentRow.Cells["CodHorario"].Value.ToString());
                    DateTime fechaHasta = DateTime.Now;

                    bool res = ghm.registrarBajaHorario(codHorario, fechaHasta);
                    if (res)
                    {
                        cargarGrillaHorarios();

                        
                    }
                    else
                        MessageBox.Show("No se pudo dar de baja horario", "Aviso", MessageBoxButtons.OK);
                }
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            myFormPadre.setFormHijo(this);
            actualizarCantHorarios();
            //myFormPadre.EspXMedSeleccionadaDeGrilla = MiEspecialidadMedico;
            myFormPadre.actualizarCambios();
            this.Dispose();
        }
    }
}
